home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1994 / 8 / 05 / term-4.0-source.lha / termMemory.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-17  |  1.9 KB  |  98 lines

  1. /*
  2. **    termMemory.c
  3. **
  4. **    Memory management routines
  5. **
  6. **    Copyright © 1990-1994 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. #define PUDDLE_SIZE 16384
  13.  
  14.     /* Memory allocation. */
  15.  
  16. STATIC struct SignalSemaphore    MemorySemaphore;
  17. STATIC APTR            MemoryPool;
  18.  
  19.     /* Prototypes for pools.lib. */
  20.  
  21. APTR __asm AsmCreatePool(register __d0 ULONG MemFlags,register __d1 ULONG PuddleSize,register __d2 ULONG ThreshSize,register __a6 struct ExecBase *SysBase);
  22. VOID __asm AsmDeletePool(register __a0 APTR PoolHeader,register __a6 struct ExecBase *SysBase);
  23. APTR __asm AsmAllocPooled(register __a0 APTR PoolHeader, register __d0 ULONG Size,register __a6 struct ExecBase *SysBase);
  24. VOID __asm AsmFreePooled(register __a0 APTR PoolHeader,register __a1 APTR Memory,register __d0 ULONG MemSize,register __a6 struct ExecBase *SysBase);
  25.  
  26. BOOLEAN
  27. MemorySetup()
  28. {
  29.     InitSemaphore(&MemorySemaphore);
  30.  
  31.     if(MemoryPool = AsmCreatePool(MEMF_PUBLIC | MEMF_ANY,PUDDLE_SIZE,PUDDLE_SIZE,SysBase))
  32.         return(TRUE);
  33.     else
  34.         return(FALSE);
  35. }
  36.  
  37. VOID
  38. MemoryCleanup()
  39. {
  40.     if(MemoryPool)
  41.     {
  42.         AsmDeletePool(MemoryPool,SysBase);
  43.  
  44.         MemoryPool = NULL;
  45.     }
  46. }
  47.  
  48. VOID __regargs
  49. FreeVecPooled(APTR Memory)
  50. {
  51.     if(Memory && MemoryPool)
  52.     {
  53.         ULONG *Data = (ULONG *)Memory;
  54.  
  55.         ObtainSemaphore(&MemorySemaphore);
  56.  
  57.         AsmFreePooled(MemoryPool,&Data[-1],Data[-1],SysBase);
  58.  
  59.         ReleaseSemaphore(&MemorySemaphore);
  60.     }
  61. }
  62.  
  63. APTR __regargs
  64. AllocVecPooled(ULONG Size,ULONG Flags)
  65. {
  66.     if(MemoryPool)
  67.     {
  68.         ULONG *Data;
  69.  
  70.         Size = (Size + 3 + sizeof(ULONG)) & ~3;
  71.  
  72.         ObtainSemaphore(&MemorySemaphore);
  73.  
  74.         if(Data = (ULONG *)AsmAllocPooled(MemoryPool,Size,SysBase))
  75.         {
  76.             ReleaseSemaphore(&MemorySemaphore);
  77.  
  78.             *Data++ = Size;
  79.  
  80.             if(Flags & MEMF_CLEAR)
  81.             {
  82.                 register ULONG *Memory = Data;
  83.  
  84.                 Size /= sizeof(ULONG);
  85.  
  86.                 while(--Size)
  87.                     *Memory++ = 0;
  88.             }
  89.  
  90.             return((APTR)Data);
  91.         }
  92.  
  93.         ReleaseSemaphore(&MemorySemaphore);
  94.     }
  95.  
  96.     return(NULL);
  97. }
  98.